package com.summer.bilibili.validator.asserts;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Documented
@Constraint(validatedBy = { AssertValidator.class }) //声明为验证约束注解
@Target({ METHOD , FIELD , ANNOTATION_TYPE , CONSTRUCTOR , PARAMETER , TYPE_USE })
@Retention(RUNTIME)
@Repeatable(Assert.List.class) // 可以在同一个元素上重复使用，通过内部 List容器类实现
public @interface Assert {
    /**
     * 非法值列表,处于列表中将会校验失败
     */
    String[] value ();

    // 验证失败时的错误消息（默认："非法的值"）
    String message () default "非法的值";

    // 验证分组（用于分组校验场景）
    Class < ? >[] groups () default {};

    // 验证负载（传递自定义元数据）
    Class < ? extends Payload >[] payload () default {};


    boolean nullable() default false;  // 空值控制


    @Target({ METHOD , FIELD , ANNOTATION_TYPE , CONSTRUCTOR , PARAMETER , TYPE_USE })
    @Retention(RUNTIME)
    @Documented
    @interface List {
        Assert[] value (); // 存储多个@Assert注解
    }
}
